#include "BSP/EXTI/exti.h"
#include "BSP/KEY/key.h"
#include "BSP/LED/led.h"
#include "BSP/BEEP/beep.h"
#include "SYSTEM/delay/delay.h"
#include "BSP/IWDG/wdg.h"

void extix_init(void) {
	GPIO_InitTypeDef gpio_init_struct;
	
	gpio_init_struct.Pin = KEY0_GPIO_PIN;
	gpio_init_struct.Mode = GPIO_MODE_IT_FALLING;
	gpio_init_struct.Pull = GPIO_PULLUP;
	HAL_GPIO_Init(KEY0_GPIO_PORT, &gpio_init_struct);
	
	gpio_init_struct.Pin = KEY1_GPIO_PIN;
	gpio_init_struct.Mode = GPIO_MODE_IT_FALLING;
	gpio_init_struct.Pull = GPIO_PULLUP;
	HAL_GPIO_Init(KEY1_GPIO_PORT, &gpio_init_struct);
	
	gpio_init_struct.Pin = KEY2_GPIO_PIN;
	gpio_init_struct.Mode = GPIO_MODE_IT_FALLING;
	gpio_init_struct.Pull = GPIO_PULLUP;
	HAL_GPIO_Init(KEY2_GPIO_PORT, &gpio_init_struct);
	
	gpio_init_struct.Pin = WKUP_GPIO_PIN;
	gpio_init_struct.Mode = GPIO_MODE_IT_RISING;
	gpio_init_struct.Pull = GPIO_PULLDOWN;
	HAL_GPIO_Init(WKUP_GPIO_PORT, &gpio_init_struct);
	
	HAL_NVIC_SetPriority(KEY0_INT_IRQn, 0, 2);
	HAL_NVIC_EnableIRQ(KEY0_INT_IRQn);
	HAL_NVIC_SetPriority(KEY1_INT_IRQn, 1, 2);
	HAL_NVIC_EnableIRQ(KEY1_INT_IRQn);
	HAL_NVIC_SetPriority(KEY2_INT_IRQn, 2, 2);
	HAL_NVIC_EnableIRQ(KEY2_INT_IRQn);
	HAL_NVIC_SetPriority(WKUP_INT_IRQn, 3, 2);
	HAL_NVIC_EnableIRQ(WKUP_INT_IRQn);
}

void KEY0_INT_IRQHandler(void) {
	HAL_GPIO_EXTI_IRQHandler(KEY0_GPIO_PIN);
	__HAL_GPIO_EXTI_CLEAR_IT(KEY0_GPIO_PIN);
}

void KEY1_INT_IRQHandler(void) {
	HAL_GPIO_EXTI_IRQHandler(KEY1_GPIO_PIN);
	__HAL_GPIO_EXTI_CLEAR_IT(KEY1_GPIO_PIN);
}

void KEY2_INT_IRQHandler(void) {
	HAL_GPIO_EXTI_IRQHandler(KEY2_GPIO_PIN);
	__HAL_GPIO_EXTI_CLEAR_IT(KEY2_GPIO_PIN);
}

void WKUP_INT_IRQHandler(void) {
	HAL_GPIO_EXTI_IRQHandler(WKUP_GPIO_PIN);
	__HAL_GPIO_EXTI_CLEAR_IT(WKUP_GPIO_PIN);
}

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_PIN) {
	switch(GPIO_PIN) {
		case KEY0_GPIO_PIN:
			LED0_TOGGLE();
			LED1_TOGGLE();
			break;
		case KEY1_GPIO_PIN:
			LED0_TOGGLE();
			break;
		case KEY2_GPIO_PIN:
			LED1_TOGGLE();
			break;
		case WKUP_GPIO_PIN:
			iwdg_feed();
	}
	delay_ms(100);
}
